// var arr = [
// 	{},
// 	{},
// 	"",
// 	"",
// 	233,
// 	233,
// 	'233',
// 	'abc',
// 	undefined,
// 	null,
// 	null,
// 	NaN,
// 	NaN,
// 	123,
// 	[2],
// 	[2],
// 	[2,3]
// ]
// Array.prototype.myUnique = function (){
//     // 第一种
//     // return Array.from(new Set(this));
//     //第二种
//     // let arr = []
//     // for(let i= 0 ;i< this.length; i++){
//     //     if(!arr.includes(this[i])){
//     //         arr.push(this[i])
//     //     }
//     // }
//     // return arr
//     return this.filter((v,idx)=>{
//         return this.indexOf(v,0) === idx
//     })
// }
// console.log(arr.myUnique())


// function fn(min,max){
//     // 集合 (min, max)
//     return Math.round(Math.random() * (max - min - 2) + min + 1 )
//     // 集合 [min, max]
//     return Math.round(Math.random() * (max - min) + min )
//     // 集合 (min,max]
//     return Math.ceil(Math.random() * (max - min) + min )
//     // 集合 [min,max)
//     return Math.floor(Math.random() * (max - min) + min )


// }

// let url = 'https://www.baidu.com/s?wd=123'
// function queryURLParams(URL){
//     let url = URL.split('?')[1];
//     const urlSearchParams = new URLSearchParams(url);
//     const params = Object.fromEntries(urlSearchParams.entries());
//     return params
// }
// console.log(queryURLParams(url))

// var arr = [1,2,3,4,5,6,7,8,9,10];
// function result(arr){
//     for(let i = 0; i < arr.length; i++){
//        let randomIndex = parseInt(Math.random() * arr.length)

//        // 存下当前正常索引值的对应数字
//        let curNum = arr[i];
//        arr[i] = arr[randomIndex];
//        arr[randomIndex] = curNum;
//     }
//     return arr
// }
// console.log(result(arr))

//借助sort
// arr.sort(()=>{
//     return Math.random() - 0.5
// })
// console.log(arr)


// flatten 数组扁平化
// var arr = [1,2,3,[4,5,6,[7,8,9,[10,11,12]]]]
// function flatten(arr){
//     // let result = [];
//     // for(let i = 0; i < arr.length; i++){
//     //     if(Array.isArray(arr[i])){
//     //         result = result.concat(flatten(arr[i]))
//     //     }else{
//     //         result.push(arr[i])
//     //     }
//     // }
//     // return result
//     while(arr.some(item => Array.isArray(item))){
//         arr = [].concat(...arr)
//     }
//     return arr
// }
// 方式二

// const flatten = arr => arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
// const flatten2 = function(arr){
//     return [].concat(...arr.map(v => Array.isArray(v) ? flatten(v) : v))
// }
// console.log(flatten2(arr))

// 两数之和

// const nums = [2,7,11,15], target = 9
// function twoSum(nums,target){
//     let map = new Map()
//     for(let i = 0; i < nums.length; i++){
//         let curNum = nums[i]
//         let otherNum = target - curNum;
//         if(map.has(otherNum)){
//             return [map.get(otherNum),i]
//         }
//         map.set(curNum,i)
//     }
// }
// console.log(twoSum(nums,target))

// 给a,b,c三个请求，希望c在a,b后完成后请求  
// const fs = require('fs')
// let arr = []
// function  fn(data){
//     arr.push(data)
//     if(arr.length === 2){
//         console.log(arr)
//     }
// }
// fs.readFile('./a.txt','utf-8',(err,data)=>{
//     fn(data)
// })
// fs.readFile('./b.txt','utf-8',(err,data)=>{
//     fn(data)
// })

// 发布订阅模式
class EventEmitter{
    handlers = {}
    on(type,handler,once = false){
        if(!this.handlers[type]){
            this.handlers[type] = []
        }
        if(!this.handlers[type].includes(handler)){
            this.handlers[type].push({
                handler,
                once
            })
            handler.once = once
        }
    }
    once(type,handler){
        this.on(type,handler,true)
    }
    off(type,handler){
        if(this.handlers[type]){
            this.handlers[type] = this.handlers[type].filter(item => item.handler !== handler)
        }
    }
    trigger(type){
        if(this.handlers[type]){
            this.handlers[type].forEach(item => {
                item.handler()
                if(item.once){
                    this.off(type,item.handler)
                }
            })
        }
    }
}

const ev = new EventEmitter();

function handler1(){
    console.log('handler1')
}

function handler2(){
    console.log('handler2')
}
function handler3(){
    console.log('handler3')
}
ev.on('test',handler1)
ev.once('test',handler2)
ev.on('test',handler3)

ev.trigger('test');
ev.trigger('test');